#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void one(void)
{
	char *p = NULL;
	char *tmp = "12345678";
	
	p = (char *)(tmp + 4);	// tmp[4]

	printf("%c %c %c %c %c %c \n", p[-0],p[-1],p[-2],p[-3],p[-4], p[-5]);	// 5 4 3 2 1 blank(\0)
}

void two(void)
{
	char *data = "12345678";
	short *tmp = NULL;
	char p[6] = {0};

	tmp = (short *)&p[2];
	*tmp = atoi(&data[4]);

	printf("%c %c %c %c %c %c\n", p[0], p[1],p[2],p[3],p[4],p[5]);	//     . 		(乱码)
	printf("%d\n", *tmp);	// 5678
	printf("%d %d %d %d %d %d\n", p[0], p[1],p[2],p[3],p[4],p[5]);	// 0 0 46 22 0 0
}

void three(void)
{
	int *p = (int *)0x1234;

	printf("p = %p\n", p);		// 0x1234
	printf("*p = %d\n", *p);	// Segmentation fault (core dumped)  非法地址
}

struct A
{
     int i;
     int *p;
};
 
int four()
{
     struct A a;
     int *pr = &a.i;

     pr[0] = 3;	// a.i = 3
     pr[1] = 3;
     printf(" a.i = %d\n a.p = %p\n &a.p = %p\n",a.i, a.p, &a.p);	// 3	0x400500	0x7ffd74254848
	 // a.i = %d   i 值
	 // a.p = %p   
	 // &a.p = %p  取a.p指针自己本身的地址
 
     a.p = pr;		// pr =  &a.i  =======> a.p = &a.i, 
     a.p[0] = 5;
     a.p[1] = 6;
     *a.p = 7;		// pr =  &a.i  =======> a.p = &a.i, 
     printf(" a.i = %d\n a.p = %p\n *a.p = %d\n &a.p = %p\n", a.i, a.p, *a.p, &a.p);	// 7	0x7ffd74254840	7	0x7ffd74254848
	 // a.i = %d   i 值
	 // a.p = %p   指向i的地址，即i的地址
	 // *a.p = %d  取 i 的值
	 // &a.p = %p  取a.p指针自己本身的地址 
     return 0;
}

void main()
{
	//one();
	two();
	//three();
	four();
}


